{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各位朋友好,今天我给大家介绍一个国外深度学习大牛Jason Brownlee写的一篇关于多变量时间序列预测的博客，我在原文的代码基础上做了一点点修改，只是为了便于大家更好的理解。在本文中，您将了解如何在Keras深度学习库中为多变量时间序列预测开发LSTM模型。读完成本文后，您将了解：\n",
    "\n",
    "* 如何将原始数据集转换为可用于时间序列预测的数据。\n",
    "* 如何准备数据并使LSTM适合多变量时间序列预测问题。\n",
    "* 如何进行预测并将结果重新调整回原始单位。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 空气污染的预测\n",
    "\n",
    "在本文中，我们将使用空气质量数据集。\n",
    "\n",
    "这个数据集来自于在美国驻中国大使馆收集的北京五年的每小时的空气质量数据。\n",
    "\n",
    "数据包括日期时间，PM2.5浓度，以及包括露点，温度，气压，风向，风速和累积的下雪小时数的天气信息。原始数据中的完整功能列表如下：\n",
    "\n",
    "* No : 行号\n",
    "* year,month,day,hour : 表示年，月，日，小时\n",
    "* pm2.5 : pm2.5污染浓度\n",
    "* DEWP : 露点（空气中水气含量达到饱和的气温，低于此温度时水气从空气中析出凝成水珠） \n",
    "* TEMP : 温度\n",
    "* PRES : 气压\n",
    "* cbwd ：风向\n",
    "* Iws ： 风速\n",
    "* ls : 累积的下雪小时数\n",
    "* lr : 累积的下小时数\n",
    "\n",
    "\n",
    "我们可以使用这些数据并构建一个预测问题，我们想通过前一个小时的天气条件和pm2.5浓度，来预测下一个小时的pm2.5浓度。\n",
    "\n",
    "你们可以在这里下载空气质量数据(https://raw.githubusercontent.com/jbrownlee/Datasets/master/pollution.csv)\n",
    "\n",
    "下面我们查看一下数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import datetime\n",
    "from math import sqrt\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.layers import LSTM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "43824\n",
      "[2010 2011 2012 2013 2014]\n"
     ]
    }
   ],
   "source": [
    "df = pd.read_csv('./data/pollution.csv')\n",
    "print(len(df))\n",
    "df.head(10)\n",
    "print(df.year.unique())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上面的数据中我们看到数据集中总共有43824条记录，时间是从2010至2014总共5年的数据，数据集中前n条数据的pm2.5的值是空值(NaN),下面我们要对数据做一些清洗工作，我们要合并年，月，日，小时并将其设置为索引例，同时删除原来的年,月,日,小时字段。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pm2.5</th>\n",
       "      <th>DEWP</th>\n",
       "      <th>TEMP</th>\n",
       "      <th>PRES</th>\n",
       "      <th>cbwd</th>\n",
       "      <th>Iws</th>\n",
       "      <th>Is</th>\n",
       "      <th>Ir</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2010-01-01 00:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-21</td>\n",
       "      <td>-11.0</td>\n",
       "      <td>1021.0</td>\n",
       "      <td>NW</td>\n",
       "      <td>1.79</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-01 01:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-21</td>\n",
       "      <td>-12.0</td>\n",
       "      <td>1020.0</td>\n",
       "      <td>NW</td>\n",
       "      <td>4.92</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-01 02:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-21</td>\n",
       "      <td>-11.0</td>\n",
       "      <td>1019.0</td>\n",
       "      <td>NW</td>\n",
       "      <td>6.71</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-01 03:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-21</td>\n",
       "      <td>-14.0</td>\n",
       "      <td>1019.0</td>\n",
       "      <td>NW</td>\n",
       "      <td>9.84</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-01 04:00:00</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-20</td>\n",
       "      <td>-12.0</td>\n",
       "      <td>1018.0</td>\n",
       "      <td>NW</td>\n",
       "      <td>12.97</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     pm2.5  DEWP  TEMP    PRES cbwd    Iws  Is  Ir\n",
       "date                                                              \n",
       "2010-01-01 00:00:00    NaN   -21 -11.0  1021.0   NW   1.79   0   0\n",
       "2010-01-01 01:00:00    NaN   -21 -12.0  1020.0   NW   4.92   0   0\n",
       "2010-01-01 02:00:00    NaN   -21 -11.0  1019.0   NW   6.71   0   0\n",
       "2010-01-01 03:00:00    NaN   -21 -14.0  1019.0   NW   9.84   0   0\n",
       "2010-01-01 04:00:00    NaN   -20 -12.0  1018.0   NW  12.97   0   0"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['date']=df.apply(lambda x:datetime.datetime(x[\"year\"], x[\"month\"], x[\"day\"],x[\"hour\"]), axis=1)\n",
    "df = df.set_index(['date'])\n",
    "df.drop(['No','year','month','day','hour'], axis=1, inplace=True)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来我们重新命名数据集的字段名,并删除前24条pm2.5的值为空的记录"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pollution</th>\n",
       "      <th>dew</th>\n",
       "      <th>temp</th>\n",
       "      <th>press</th>\n",
       "      <th>wnd_dir</th>\n",
       "      <th>wnd_spd</th>\n",
       "      <th>snow</th>\n",
       "      <th>rain</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2010-01-02 00:00:00</th>\n",
       "      <td>129.0</td>\n",
       "      <td>-16</td>\n",
       "      <td>-4.0</td>\n",
       "      <td>1020.0</td>\n",
       "      <td>SE</td>\n",
       "      <td>1.79</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-02 01:00:00</th>\n",
       "      <td>148.0</td>\n",
       "      <td>-15</td>\n",
       "      <td>-4.0</td>\n",
       "      <td>1020.0</td>\n",
       "      <td>SE</td>\n",
       "      <td>2.68</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-02 02:00:00</th>\n",
       "      <td>159.0</td>\n",
       "      <td>-11</td>\n",
       "      <td>-5.0</td>\n",
       "      <td>1021.0</td>\n",
       "      <td>SE</td>\n",
       "      <td>3.57</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-02 03:00:00</th>\n",
       "      <td>181.0</td>\n",
       "      <td>-7</td>\n",
       "      <td>-5.0</td>\n",
       "      <td>1022.0</td>\n",
       "      <td>SE</td>\n",
       "      <td>5.36</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2010-01-02 04:00:00</th>\n",
       "      <td>138.0</td>\n",
       "      <td>-7</td>\n",
       "      <td>-5.0</td>\n",
       "      <td>1022.0</td>\n",
       "      <td>SE</td>\n",
       "      <td>6.25</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     pollution  dew  temp   press wnd_dir  wnd_spd  snow  rain\n",
       "date                                                                          \n",
       "2010-01-02 00:00:00      129.0  -16  -4.0  1020.0      SE     1.79     0     0\n",
       "2010-01-02 01:00:00      148.0  -15  -4.0  1020.0      SE     2.68     0     0\n",
       "2010-01-02 02:00:00      159.0  -11  -5.0  1021.0      SE     3.57     0     0\n",
       "2010-01-02 03:00:00      181.0   -7  -5.0  1022.0      SE     5.36     1     0\n",
       "2010-01-02 04:00:00      138.0   -7  -5.0  1022.0      SE     6.25     2     0"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain']\n",
    "df['pollution'].fillna(0, inplace=True)\n",
    "# 删除前24小时的数据\n",
    "df = df[24:]\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面我们对除风向(wnd_dir)以外的7个变量进行可视化，我们要查看一下它们的时序图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 7 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "values = df.values\n",
    "# 指定要可视化的例\n",
    "groups = [0, 1, 2, 3, 5, 6, 7]\n",
    "i = 1\n",
    "# plot each column\n",
    "plt.figure(figsize=(8,6))\n",
    "for group in groups:\n",
    "    plt.subplot(len(groups), 1, i)\n",
    "    plt.plot(values[:, group])\n",
    "    plt.title(df.columns[group], y=0.5, loc='right')\n",
    "    i += 1\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多变量LSTM预测模型\n",
    "\n",
    "在目前这个应用场景中,我们的特征变量有7个(除pollution变量以外的所有变量)，而我们的目标变量只有一个(pollution)，我们想通过前一小时的7个特征变量来预测后一小时的污染浓度变量(pollution)，这就是一个典型的多变量时间序列预测的问题。下面我们要使用LSTM模型来解决这个多变量时间序列的预测问题。\n",
    "\n",
    "## 为LSTM模型准备数据\n",
    "\n",
    "这里将是本文的一个重点,目前的我们的数据集是一个时间序列数据集，它没有标签，接下来我们要做的就是将时间序列数据转换成监督学习的数据并且生成标签。然后对输入的变量进行标准化处理。 考虑到污染测量和前一时刻(t-1)的天气条件，我们将监督学习问题定为预测当前小时（t）的污染。\n",
    "\n",
    "如何将时间序列数据转换成监督学习的数据？这里我们定义了一个函数:series_to_supervised(), 它通过数据平移的方式将我们的目标变量前移一个时间单位，这样就形成了数据的标签,有了标签它就变成了监督学习的数据，这样我们就可以训练lstm模型了。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将序列转换成监督式学习\n",
    "def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):\n",
    "    n_vars = 1 if type(data) is list else data.shape[1]\n",
    "    df = pd.DataFrame(data)\n",
    "    cols, names = list(), list()\n",
    "    # 输入序列(t-n, ... t-1)\n",
    "    for i in range(n_in, 0, -1):\n",
    "        cols.append(df.shift(i))\n",
    "        names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "    # 预测序列 (t, t+1, ... t+n)\n",
    "    for i in range(0, n_out):\n",
    "        cols.append(df.shift(-i))\n",
    "        if i == 0:\n",
    "            names += [('var%d(t)' % (j+1)) for j in range(n_vars)]\n",
    "        else:\n",
    "            names += [('var%d(t+%d)' % (j+1, i)) for j in range(n_vars)]\n",
    "    # 将他们整合在一起\n",
    "    agg = pd.concat(cols, axis=1)\n",
    "    agg.columns = names\n",
    "    # 删除那些包含空值(NaN)的行\n",
    "    if dropnan:\n",
    "        agg.dropna(inplace=True)\n",
    "    return agg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var5(t-1)</th>\n",
       "      <th>var6(t-1)</th>\n",
       "      <th>var7(t-1)</th>\n",
       "      <th>var8(t-1)</th>\n",
       "      <th>var1(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.129779</td>\n",
       "      <td>0.352941</td>\n",
       "      <td>0.245902</td>\n",
       "      <td>0.527273</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.002290</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.148893</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.148893</td>\n",
       "      <td>0.367647</td>\n",
       "      <td>0.245902</td>\n",
       "      <td>0.527273</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.003811</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.159960</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.159960</td>\n",
       "      <td>0.426471</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.545454</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.005332</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.182093</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.182093</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.008391</td>\n",
       "      <td>0.037037</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.138833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.138833</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.009912</td>\n",
       "      <td>0.074074</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.109658</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)  var5(t-1)  var6(t-1)  \\\n",
       "1   0.129779   0.352941   0.245902   0.527273   0.666667   0.002290   \n",
       "2   0.148893   0.367647   0.245902   0.527273   0.666667   0.003811   \n",
       "3   0.159960   0.426471   0.229508   0.545454   0.666667   0.005332   \n",
       "4   0.182093   0.485294   0.229508   0.563637   0.666667   0.008391   \n",
       "5   0.138833   0.485294   0.229508   0.563637   0.666667   0.009912   \n",
       "\n",
       "   var7(t-1)  var8(t-1)   var1(t)  \n",
       "1   0.000000        0.0  0.148893  \n",
       "2   0.000000        0.0  0.159960  \n",
       "3   0.000000        0.0  0.182093  \n",
       "4   0.037037        0.0  0.138833  \n",
       "5   0.074074        0.0  0.109658  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "values = df.values\n",
    "#对风向字段进行编码\n",
    "encoder = LabelEncoder()\n",
    "values[:,4] = encoder.fit_transform(values[:,4])\n",
    "# 确保所有变量都是实数型\n",
    "values = values.astype('float32')\n",
    "#对数据进行标准化出来\n",
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaled = scaler.fit_transform(values)\n",
    "# 将时间序列数据转换成监督学习数据\n",
    "reframed = series_to_supervised(scaled, 1, 1)\n",
    "# 删除那些不需要预测的列\n",
    "reframed.drop(reframed.columns[[9,10,11,12,13,14,15]], axis=1, inplace=True)\n",
    "reframed.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上面的输出结果中我们看见var(t-1)至var8(t-1)为我们的前一小时的特征变量，var1(t)为当前时刻t的目标变量，var(t)是var(t-1)进行一次数据平移所产生的结果。这样我们就可以利用t-1时刻的特征数据来预测t时刻污染浓度。\n",
    "\n",
    "到目前为止我们已经有了特征集和标签，下面我们就可以为LSTM模型准备训练集和测试集了。由于这是时间序列的数据,t时刻的污染浓度和t-1时刻的天气条件是有密切关系的，所以在准训练集和测试集时，我们不能对原始数据进行乱序操作。这里我们要按顺序将第一年的数据作为训练集，将后面四年的数据作为测试集。然后我们将训练集和测试集转化成3维数组的格式。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8760, 1, 8) (8760,) (35039, 1, 8) (35039,)\n"
     ]
    }
   ],
   "source": [
    "# 将数据分割为训练集和测试集\n",
    "values = reframed.values\n",
    "n_train_hours = 365 * 24\n",
    "train = values[:n_train_hours, :]\n",
    "test = values[n_train_hours:, :]\n",
    "# 分离出特征集与标签\n",
    "train_X, train_y = train[:, :-1], train[:, -1]\n",
    "test_X, test_y = test[:, :-1], test[:, -1]\n",
    "# 转换成3维数组 [样本数, 时间步 ,特征数]\n",
    "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))\n",
    "print(train_X.shape, train_y.shape, test_X.shape, test_y.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以看到，在训练集中我们用8千多个小时的数据用于训练模型，然后对3W多小时的测试数据进行预测和评估。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义LSTM模型\n",
    "\n",
    "我们将定义一个LSTM模型，在它的第一个隐藏层中有50个神经元，在输出层中有1个神经元用于预测污染浓度。输入数据的维度将是1个时间步(即1小时)和8个特征。\n",
    "\n",
    "我们将使用平均绝对误差（MAE）损失函数和随机梯度下降的有效Adam版本。该模型的批量大小(batch_size)为72的50个训练周期。请记住，Keras中LSTM的内部状态在每个批次结束时重置，因此内部状态可能是天数的函数,这可能会对你有帮助。\n",
    "\n",
    "最后，我们通过在fit()方法中设置validation_data参数来跟踪训练期间的训练和测试损失。在训练结束时，对训练和测试损失进行可视化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Logging before flag parsing goes to stderr.\n",
      "W0825 20:12:11.721156 140736170390400 deprecation_wrapper.py:119] From /anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:66: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.\n",
      "\n",
      "W0825 20:12:11.740559 140736170390400 deprecation_wrapper.py:119] From /anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:541: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n",
      "\n",
      "W0825 20:12:11.743970 140736170390400 deprecation_wrapper.py:119] From /anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:4432: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.\n",
      "\n",
      "W0825 20:12:11.969975 140736170390400 deprecation_wrapper.py:119] From /anaconda3/lib/python3.7/site-packages/keras/optimizers.py:793: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "lstm_1 (LSTM)                (None, 50)                11800     \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 51        \n",
      "=================================================================\n",
      "Total params: 11,851\n",
      "Trainable params: 11,851\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "# 创建模型\n",
    "model = Sequential()\n",
    "model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))\n",
    "model.add(Dense(1))\n",
    "model.compile(loss='mae', optimizer='adam')\n",
    "print(model.summary())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练LSTM模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "W0825 20:12:12.231505 140736170390400 deprecation.py:323] From /anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n",
      "Instructions for updating:\n",
      "Use tf.where in 2.0, which has the same broadcast rule as np.where\n",
      "W0825 20:12:12.847187 140736170390400 deprecation_wrapper.py:119] From /anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.\n",
      "\n",
      "W0825 20:12:12.953648 140736170390400 deprecation_wrapper.py:119] From /anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.\n",
      "\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 8760 samples, validate on 35039 samples\n",
      "Epoch 1/50\n",
      " - 2s - loss: 0.0600 - val_loss: 0.0543\n",
      "Epoch 2/50\n",
      " - 1s - loss: 0.0418 - val_loss: 0.0621\n",
      "Epoch 3/50\n",
      " - 1s - loss: 0.0253 - val_loss: 0.0536\n",
      "Epoch 4/50\n",
      " - 1s - loss: 0.0176 - val_loss: 0.0414\n",
      "Epoch 5/50\n",
      " - 1s - loss: 0.0155 - val_loss: 0.0250\n",
      "Epoch 6/50\n",
      " - 1s - loss: 0.0151 - val_loss: 0.0180\n",
      "Epoch 7/50\n",
      " - 1s - loss: 0.0149 - val_loss: 0.0167\n",
      "Epoch 8/50\n",
      " - 1s - loss: 0.0148 - val_loss: 0.0159\n",
      "Epoch 9/50\n",
      " - 1s - loss: 0.0149 - val_loss: 0.0156\n",
      "Epoch 10/50\n",
      " - 1s - loss: 0.0147 - val_loss: 0.0148\n",
      "Epoch 11/50\n",
      " - 1s - loss: 0.0148 - val_loss: 0.0150\n",
      "Epoch 12/50\n",
      " - 1s - loss: 0.0148 - val_loss: 0.0149\n",
      "Epoch 13/50\n",
      " - 1s - loss: 0.0148 - val_loss: 0.0145\n",
      "Epoch 14/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0141\n",
      "Epoch 15/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0140\n",
      "Epoch 16/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0136\n",
      "Epoch 17/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0141\n",
      "Epoch 18/50\n",
      " - 1s - loss: 0.0147 - val_loss: 0.0138\n",
      "Epoch 19/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0137\n",
      "Epoch 20/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0135\n",
      "Epoch 21/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0134\n",
      "Epoch 22/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0135\n",
      "Epoch 23/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0133\n",
      "Epoch 24/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0134\n",
      "Epoch 25/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0133\n",
      "Epoch 26/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0136\n",
      "Epoch 27/50\n",
      " - 1s - loss: 0.0148 - val_loss: 0.0136\n",
      "Epoch 28/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0134\n",
      "Epoch 29/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0133\n",
      "Epoch 30/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0134\n",
      "Epoch 31/50\n",
      " - 1s - loss: 0.0149 - val_loss: 0.0134\n",
      "Epoch 32/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0133\n",
      "Epoch 33/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0133\n",
      "Epoch 34/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 35/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 36/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 37/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 38/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 39/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0132\n",
      "Epoch 40/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 41/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 42/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0132\n",
      "Epoch 43/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 44/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 45/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 46/50\n",
      " - 1s - loss: 0.0143 - val_loss: 0.0133\n",
      "Epoch 47/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0132\n",
      "Epoch 48/50\n",
      " - 1s - loss: 0.0143 - val_loss: 0.0133\n",
      "Epoch 49/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0133\n",
      "Epoch 50/50\n",
      " - 1s - loss: 0.0143 - val_loss: 0.0133\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练模型\n",
    "history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)\n",
    "# 对损失进行可视化\n",
    "plt.plot(history.history['loss'], label='train')\n",
    "plt.plot(history.history['val_loss'], label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估LSTM模型\n",
    "\n",
    "在模型训练结束后，我们可以预测整个测试数据集。\n",
    "\n",
    "由于我们在训练模型之前已经将所有的特征集和标签进行了标准化处理即将数据值缩放到了0-1之间，因此我们的预测结果也是在0-1之间，为了对预测结果进行有效评估，我们必须将预测结果和标签值全部转换成没有标准处理之前的实际值，这样我们才能进行有效评估。\n",
    "\n",
    "通过将预测结果和测试集的标签值进行逆向缩放，我们就得到了实际值，这样我们可以计算模型的误差分数。我们使用均方根误差(RMSE)作为评估指标。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test RMSE: 26.404\n"
     ]
    }
   ],
   "source": [
    "# 对测试集进行预测\n",
    "yhat = model.predict(test_X)\n",
    "test_X = test_X.reshape((test_X.shape[0], test_X.shape[2]))\n",
    "# 对预测值进行逆标准处理\n",
    "inv_yhat = np.concatenate((yhat, test_X[:, 1:]), axis=1)\n",
    "inv_yhat = scaler.inverse_transform(inv_yhat)\n",
    "inv_yhat = inv_yhat[:,0]\n",
    "# 对测试集标签进行逆标准化处理\n",
    "test_y = test_y.reshape((len(test_y), 1))\n",
    "inv_y = np.concatenate((test_y, test_X[:, 1:]), axis=1)\n",
    "inv_y = scaler.inverse_transform(inv_y)\n",
    "inv_y = inv_y[:,0]\n",
    "# 计算 RMSE\n",
    "rmse = sqrt(mean_squared_error(inv_y, inv_yhat))\n",
    "print('Test RMSE: %.3f' % rmse)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 完善LSTM模型:预测未来多天的污染浓度\n",
    "\n",
    "前面这个模型我们是用t-1时刻的天气数据来预测t时刻的污染浓度,也就是说我们只能预测未来1小时的污染情况，有没有办法让我们的模型可以预测未来几个小时的空气污染情况呢？\n",
    "\n",
    "为了解决预测未来n个小时的空气污染浓度，我们只要将原先的特征集平移n个时间步，例如我们要预测未来3小时的污染浓度，我们只需要调用series_to_supervised方法，并将参数n_in设置为3，就可以将特征集往前平移3个时间步。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置预测未来3小时的污染\n",
    "n_hours = 3\n",
    "n_features = 8\n",
    "# 将时间序列转换成监督学习数据集\n",
    "reframed = series_to_supervised(scaled, n_hours, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们的数据集中有3 * 8 + 8列。我们将前24列作为前3小时(t-3,t-2,t-1)的特征。我们将在下一个小时(t)的污染变量作为标签，如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-3)</th>\n",
       "      <th>var2(t-3)</th>\n",
       "      <th>var3(t-3)</th>\n",
       "      <th>var4(t-3)</th>\n",
       "      <th>var5(t-3)</th>\n",
       "      <th>var6(t-3)</th>\n",
       "      <th>var7(t-3)</th>\n",
       "      <th>var8(t-3)</th>\n",
       "      <th>var1(t-2)</th>\n",
       "      <th>var2(t-2)</th>\n",
       "      <th>...</th>\n",
       "      <th>var7(t-1)</th>\n",
       "      <th>var8(t-1)</th>\n",
       "      <th>var1(t)</th>\n",
       "      <th>var2(t)</th>\n",
       "      <th>var3(t)</th>\n",
       "      <th>var4(t)</th>\n",
       "      <th>var5(t)</th>\n",
       "      <th>var6(t)</th>\n",
       "      <th>var7(t)</th>\n",
       "      <th>var8(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.129779</td>\n",
       "      <td>0.352941</td>\n",
       "      <td>0.245902</td>\n",
       "      <td>0.527273</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.002290</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.148893</td>\n",
       "      <td>0.367647</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.182093</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.008391</td>\n",
       "      <td>0.037037</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.148893</td>\n",
       "      <td>0.367647</td>\n",
       "      <td>0.245902</td>\n",
       "      <td>0.527273</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.003811</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.159960</td>\n",
       "      <td>0.426471</td>\n",
       "      <td>...</td>\n",
       "      <td>0.037037</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.138833</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.009912</td>\n",
       "      <td>0.074074</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.159960</td>\n",
       "      <td>0.426471</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.545454</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.005332</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.182093</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>...</td>\n",
       "      <td>0.074074</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.109658</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.213115</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.011433</td>\n",
       "      <td>0.111111</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.182093</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.008391</td>\n",
       "      <td>0.037037</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.138833</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>...</td>\n",
       "      <td>0.111111</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.105634</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.213115</td>\n",
       "      <td>0.581818</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.014492</td>\n",
       "      <td>0.148148</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.138833</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.009912</td>\n",
       "      <td>0.074074</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.109658</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>...</td>\n",
       "      <td>0.148148</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.124748</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.017551</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.109658</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.213115</td>\n",
       "      <td>0.563637</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.011433</td>\n",
       "      <td>0.111111</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.105634</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.120724</td>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.213115</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.020610</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.105634</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.213115</td>\n",
       "      <td>0.581818</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.014492</td>\n",
       "      <td>0.148148</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.124748</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.132797</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.618183</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.023669</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>0.124748</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.017551</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.120724</td>\n",
       "      <td>0.470588</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.140845</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.636364</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.029018</td>\n",
       "      <td>0.037037</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>0.120724</td>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.213115</td>\n",
       "      <td>0.600000</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.020610</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.132797</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>...</td>\n",
       "      <td>0.037037</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.152918</td>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.636364</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.034367</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>0.132797</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.618183</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.023669</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.140845</td>\n",
       "      <td>0.485294</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.148893</td>\n",
       "      <td>0.470588</td>\n",
       "      <td>0.229508</td>\n",
       "      <td>0.636364</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0.039716</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 32 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    var1(t-3)  var2(t-3)  var3(t-3)  var4(t-3)  var5(t-3)  var6(t-3)  \\\n",
       "3    0.129779   0.352941   0.245902   0.527273   0.666667   0.002290   \n",
       "4    0.148893   0.367647   0.245902   0.527273   0.666667   0.003811   \n",
       "5    0.159960   0.426471   0.229508   0.545454   0.666667   0.005332   \n",
       "6    0.182093   0.485294   0.229508   0.563637   0.666667   0.008391   \n",
       "7    0.138833   0.485294   0.229508   0.563637   0.666667   0.009912   \n",
       "8    0.109658   0.485294   0.213115   0.563637   0.666667   0.011433   \n",
       "9    0.105634   0.485294   0.213115   0.581818   0.666667   0.014492   \n",
       "10   0.124748   0.485294   0.229508   0.600000   0.666667   0.017551   \n",
       "11   0.120724   0.470588   0.213115   0.600000   0.666667   0.020610   \n",
       "12   0.132797   0.485294   0.229508   0.618183   0.666667   0.023669   \n",
       "\n",
       "    var7(t-3)  var8(t-3)  var1(t-2)  var2(t-2)  ...  var7(t-1)  var8(t-1)  \\\n",
       "3    0.000000        0.0   0.148893   0.367647  ...   0.000000        0.0   \n",
       "4    0.000000        0.0   0.159960   0.426471  ...   0.037037        0.0   \n",
       "5    0.000000        0.0   0.182093   0.485294  ...   0.074074        0.0   \n",
       "6    0.037037        0.0   0.138833   0.485294  ...   0.111111        0.0   \n",
       "7    0.074074        0.0   0.109658   0.485294  ...   0.148148        0.0   \n",
       "8    0.111111        0.0   0.105634   0.485294  ...   0.000000        0.0   \n",
       "9    0.148148        0.0   0.124748   0.485294  ...   0.000000        0.0   \n",
       "10   0.000000        0.0   0.120724   0.470588  ...   0.000000        0.0   \n",
       "11   0.000000        0.0   0.132797   0.485294  ...   0.037037        0.0   \n",
       "12   0.000000        0.0   0.140845   0.485294  ...   0.000000        0.0   \n",
       "\n",
       "     var1(t)   var2(t)   var3(t)   var4(t)   var5(t)   var6(t)   var7(t)  \\\n",
       "3   0.182093  0.485294  0.229508  0.563637  0.666667  0.008391  0.037037   \n",
       "4   0.138833  0.485294  0.229508  0.563637  0.666667  0.009912  0.074074   \n",
       "5   0.109658  0.485294  0.213115  0.563637  0.666667  0.011433  0.111111   \n",
       "6   0.105634  0.485294  0.213115  0.581818  0.666667  0.014492  0.148148   \n",
       "7   0.124748  0.485294  0.229508  0.600000  0.666667  0.017551  0.000000   \n",
       "8   0.120724  0.470588  0.213115  0.600000  0.666667  0.020610  0.000000   \n",
       "9   0.132797  0.485294  0.229508  0.618183  0.666667  0.023669  0.000000   \n",
       "10  0.140845  0.485294  0.229508  0.636364  0.666667  0.029018  0.037037   \n",
       "11  0.152918  0.470588  0.229508  0.636364  0.666667  0.034367  0.000000   \n",
       "12  0.148893  0.470588  0.229508  0.636364  0.666667  0.039716  0.000000   \n",
       "\n",
       "    var8(t)  \n",
       "3       0.0  \n",
       "4       0.0  \n",
       "5       0.0  \n",
       "6       0.0  \n",
       "7       0.0  \n",
       "8       0.0  \n",
       "9       0.0  \n",
       "10      0.0  \n",
       "11      0.0  \n",
       "12      0.0  \n",
       "\n",
       "[10 rows x 32 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reframed.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['var1(t-3)', 'var2(t-3)', 'var3(t-3)', 'var4(t-3)', 'var5(t-3)',\n",
      "       'var6(t-3)', 'var7(t-3)', 'var8(t-3)', 'var1(t-2)', 'var2(t-2)',\n",
      "       'var3(t-2)', 'var4(t-2)', 'var5(t-2)', 'var6(t-2)', 'var7(t-2)',\n",
      "       'var8(t-2)', 'var1(t-1)', 'var2(t-1)', 'var3(t-1)', 'var4(t-1)',\n",
      "       'var5(t-1)', 'var6(t-1)', 'var7(t-1)', 'var8(t-1)', 'var1(t)',\n",
      "       'var2(t)', 'var3(t)', 'var4(t)', 'var5(t)', 'var6(t)', 'var7(t)',\n",
      "       'var8(t)'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "print(reframed.columns)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分离训练集和测试集\n",
    "values = reframed.values\n",
    "n_train_hours = 365 * 24\n",
    "train = values[:n_train_hours, :]\n",
    "test = values[n_train_hours:, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8760, 24) 8760 (8760,)\n"
     ]
    }
   ],
   "source": [
    "# 分离特征集和标签\n",
    "n_obs = n_hours * n_features\n",
    "train_X, train_y = train[:, :n_obs], train[:, -n_features]\n",
    "test_X, test_y = test[:, :n_obs], test[:, -n_features]\n",
    "print(train_X.shape, len(train_X), train_y.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来我们要讲训练数据和测试数据转换成3维数组格式，与之前的3维数组不一样的是，此时我们三维数组的第二个维度将是3。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 转换成3维数据格式 [样本数, 时间步, 特征数]\n",
    "train_X = train_X.reshape((train_X.shape[0], n_hours, n_features))\n",
    "test_X = test_X.reshape((test_X.shape[0], n_hours, n_features))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 8760 samples, validate on 35037 samples\n",
      "Epoch 1/50\n",
      " - 2s - loss: 0.0466 - val_loss: 0.0677\n",
      "Epoch 2/50\n",
      " - 1s - loss: 0.0278 - val_loss: 0.0547\n",
      "Epoch 3/50\n",
      " - 1s - loss: 0.0221 - val_loss: 0.0297\n",
      "Epoch 4/50\n",
      " - 1s - loss: 0.0211 - val_loss: 0.0239\n",
      "Epoch 5/50\n",
      " - 1s - loss: 0.0204 - val_loss: 0.0225\n",
      "Epoch 6/50\n",
      " - 1s - loss: 0.0201 - val_loss: 0.0200\n",
      "Epoch 7/50\n",
      " - 1s - loss: 0.0197 - val_loss: 0.0185\n",
      "Epoch 8/50\n",
      " - 1s - loss: 0.0192 - val_loss: 0.0181\n",
      "Epoch 9/50\n",
      " - 1s - loss: 0.0187 - val_loss: 0.0179\n",
      "Epoch 10/50\n",
      " - 1s - loss: 0.0183 - val_loss: 0.0175\n",
      "Epoch 11/50\n",
      " - 1s - loss: 0.0180 - val_loss: 0.0170\n",
      "Epoch 12/50\n",
      " - 1s - loss: 0.0176 - val_loss: 0.0166\n",
      "Epoch 13/50\n",
      " - 1s - loss: 0.0173 - val_loss: 0.0159\n",
      "Epoch 14/50\n",
      " - 1s - loss: 0.0168 - val_loss: 0.0157\n",
      "Epoch 15/50\n",
      " - 1s - loss: 0.0166 - val_loss: 0.0160\n",
      "Epoch 16/50\n",
      " - 1s - loss: 0.0160 - val_loss: 0.0158\n",
      "Epoch 17/50\n",
      " - 1s - loss: 0.0157 - val_loss: 0.0156\n",
      "Epoch 18/50\n",
      " - 1s - loss: 0.0155 - val_loss: 0.0155\n",
      "Epoch 19/50\n",
      " - 1s - loss: 0.0151 - val_loss: 0.0155\n",
      "Epoch 20/50\n",
      " - 1s - loss: 0.0151 - val_loss: 0.0162\n",
      "Epoch 21/50\n",
      " - 1s - loss: 0.0150 - val_loss: 0.0161\n",
      "Epoch 22/50\n",
      " - 1s - loss: 0.0147 - val_loss: 0.0160\n",
      "Epoch 23/50\n",
      " - 1s - loss: 0.0147 - val_loss: 0.0161\n",
      "Epoch 24/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0158\n",
      "Epoch 25/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0158\n",
      "Epoch 26/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0157\n",
      "Epoch 27/50\n",
      " - 1s - loss: 0.0146 - val_loss: 0.0156\n",
      "Epoch 28/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0156\n",
      "Epoch 29/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0152\n",
      "Epoch 30/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0153\n",
      "Epoch 31/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0156\n",
      "Epoch 32/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0155\n",
      "Epoch 33/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0153\n",
      "Epoch 34/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0153\n",
      "Epoch 35/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0150\n",
      "Epoch 36/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0145\n",
      "Epoch 37/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0145\n",
      "Epoch 38/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0143\n",
      "Epoch 39/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0141\n",
      "Epoch 40/50\n",
      " - 1s - loss: 0.0142 - val_loss: 0.0143\n",
      "Epoch 41/50\n",
      " - 1s - loss: 0.0144 - val_loss: 0.0145\n",
      "Epoch 42/50\n",
      " - 1s - loss: 0.0142 - val_loss: 0.0139\n",
      "Epoch 43/50\n",
      " - 1s - loss: 0.0145 - val_loss: 0.0145\n",
      "Epoch 44/50\n",
      " - 1s - loss: 0.0142 - val_loss: 0.0142\n",
      "Epoch 45/50\n",
      " - 1s - loss: 0.0143 - val_loss: 0.0145\n",
      "Epoch 46/50\n",
      " - 1s - loss: 0.0143 - val_loss: 0.0139\n",
      "Epoch 47/50\n",
      " - 1s - loss: 0.0143 - val_loss: 0.0139\n",
      "Epoch 48/50\n",
      " - 1s - loss: 0.0142 - val_loss: 0.0138\n",
      "Epoch 49/50\n",
      " - 1s - loss: 0.0142 - val_loss: 0.0139\n",
      "Epoch 50/50\n",
      " - 1s - loss: 0.0143 - val_loss: 0.0135\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD7CAYAAABkO19ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nO3deXRc5Z3m8e+vSqV9X2xsy7YMXsDsYAxpTLODnaRDSIBAmh66k4k7J505yUmTCczppAPnZCb09CSZnM7SdEJPmmwwMEncCWlM2EIIGGww4AVj41VeZMmWZMnWVlW/+eOWbFmopLKtxb73+ZxTp27d+1bVe7F47lvvfe97zd0REZHwik10BUREZGwp6EVEQk5BLyIScgp6EZGQU9CLiIScgl5EJORyCnozW2xmG8xsk5ndM8T2AjN7JLN9hZk1ZNb/uZmtHvBIm9kFo7sLIiIyHBtpHL2ZxYF3gOuBRuBV4A53XzegzGeA89z902Z2O3Czu39s0OecC/zK3U8f5X0QEZFh5OVQZiGwyd03A5jZz4GbgHUDytwEfDWz/BjwT2ZmfvRR5A7gZyN9WW1trTc0NORQLRER6bdq1aoWd68balsuQT8N2DHgdSNwabYy7p40s3agBmgZUOZjBAeEYTU0NLBy5cocqiUiIv3MbFu2bbn00dsQ6wb39wxbxswuBQ65+5osFVxqZivNbGVzc3MOVRIRkVzlEvSNwPQBr+uBXdnKmFkeUAHsH7D9dobptnH3B919gbsvqKsb8peHiIgcp1yC/lVgjpnNMrN8gtBeNqjMMuCuzPItwDP9/fNmFgNuBX4+OlUWEZFjMWIffabP/bPAk0AceMjd15rZ/cBKd18G/BB42Mw2EbTkbx/wEX8KNPafzBURGQt9fX00NjbS3d090VUZU4WFhdTX15NIJHJ+z4jDK8fbggULXCdjReRYbdmyhbKyMmpqajAb6rThqc/d2bdvHx0dHcyaNeuobWa2yt0XDPU+XRkrIqHQ3d0d6pAHMDNqamqO+VeLgl5EQiPMId/vePYxPEHftgOe+Rrs16kAEZGBwhP03W3w+3+A3W9MdE1EJILa2tr47ne/e8zve//7309bW9sY1OiI8AR95czguXXrhFZDRKIpW9CnUqlh3/fEE09QWVk5VtUCcpsC4dRQWA5F1dCa9SpgEZExc8899/Duu+9ywQUXkEgkKC0tZcqUKaxevZp169bx4Q9/mB07dtDd3c3nPvc5li5dChyZ9qWzs5MlS5awaNEi/vjHPzJt2jR+9atfUVRUdMJ1C0/QA1Q1qEUvItz372tZt+vAqH7m/Knl/P2fnZ11+9e//nXWrFnD6tWree655/jABz7AmjVrDg+DfOihh6iurqarq4tLLrmEj370o9TU1Bz1GRs3buRnP/sZ//Iv/8Jtt93G448/zp133nnCdQ9P1w1A1UxoU4teRCbewoULjxrr/u1vf5vzzz+fyy67jB07drBx48b3vGfWrFlccEFwy46LL76YrVu3jkpdwteiX/9rSKcgFp/o2ojIBBmu5T1eSkpKDi8/99xz/O53v+Oll16iuLiYq666asix8AUFBYeX4/E4XV1do1KXcLXoK2dCug8ODJ5zTURkbJWVldHR0THktvb2dqqqqiguLubtt9/m5ZdfHte6haxFnxl507YNKqcPX1ZEZBTV1NRw+eWXc84551BUVMTkyZMPb1u8eDHf//73Oe+885g3bx6XXXbZuNYtZEHfEDy3boWGRRNZExGJoJ/+9KdDri8oKOC3v/3tkNv6++Fra2tZs+bILTvuvvvuUatXuLpuKqaDxTTEUkRkgHAFfTwB5fUaYikiMkC4gh40xFJEZJBwBr1a9CIih4Uv6CsboLMJ+kZn/KmIyKkufEHfP/KmbfuEVkNE5GQRwqDXLJYiMv6Od5pigG9961scOnRolGt0RPiC/vB0xTohKyLj52QO+nBdMAVQOgnyitSiF5FxNXCa4uuvv55Jkybx6KOP0tPTw80338x9993HwYMHue2222hsbCSVSvHlL3+ZpqYmdu3axdVXX01tbS3PPvvsqNctfEFvpiGWIlH323tgz1uj+5mnnQtLvp5188BpipcvX85jjz3GK6+8grvzoQ99iN///vc0NzczdepUfvOb3wDBHDgVFRV84xvf4Nlnn6W2tnZ065wRvq4b0Lz0IjKhli9fzvLly7nwwgu56KKLePvtt9m4cSPnnnsuv/vd7/jSl77ECy+8QEVFxbjUJ3wtegj66be+CO5BC19EomWYlvd4cHfuvfde/vqv//o921atWsUTTzzBvffeyw033MBXvvKVMa9PeFv0vR3Q1TrRNRGRiBg4TfGNN97IQw89RGdnJwA7d+5k7969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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 定义模型\n",
    "model = Sequential()\n",
    "model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))\n",
    "model.add(Dense(1))\n",
    "model.compile(loss='mae', optimizer='adam')\n",
    "# 训练模型\n",
    "history = model.fit(train_X, train_y, epochs=50, batch_size=72, validation_data=(test_X, test_y), verbose=2, shuffle=False)\n",
    "# 可视化\n",
    "plt.plot(history.history['loss'], label='train')\n",
    "plt.plot(history.history['val_loss'], label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test RMSE: 26.332\n"
     ]
    }
   ],
   "source": [
    "# 对测试集进行预测\n",
    "yhat = model.predict(test_X)\n",
    "test_X = test_X.reshape((test_X.shape[0], n_hours*n_features))\n",
    "# 对预测数据进行逆标准化\n",
    "inv_yhat = np.concatenate((yhat, test_X[:, -7:]), axis=1)\n",
    "inv_yhat = scaler.inverse_transform(inv_yhat)\n",
    "inv_yhat = inv_yhat[:,0]\n",
    "# 对测试集标签进行逆标准化\n",
    "test_y = test_y.reshape((len(test_y), 1))\n",
    "inv_y = np.concatenate((test_y, test_X[:, -7:]), axis=1)\n",
    "inv_y = scaler.inverse_transform(inv_y)\n",
    "inv_y = inv_y[:,0]\n",
    "# 计算均方根误差\n",
    "rmse = sqrt(mean_squared_error(inv_y, inv_yhat))\n",
    "print('Test RMSE: %.3f' % rmse)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
